噩耗~早上起床發現昨天上傳沒成功,鐵人中斷了!!不過還是繼續寫下去吧!
中秋節連假第二天,今天開始串接實測囉~
python使用的環境如下,不過測試時有在不同版本中跑過,都能夠運行
>python -V
Python 3.8.5
那就直接開始測試囉,以下測試都使用規格書中的參數。
需要特別加工的部份為Nonce、Sign以及Message。
項次 | 參數 | 說明 |
---|---|---|
1 | Version | 目前請固定傳值 1.0.0 |
2 | ShopNo | 按照取得的商店名稱 |
3 | APIService | 填入永豐API功能名稱 |
4 | Nonce | 向永豐API POST取得之60秒內有效的時間戳記。 |
5 | Sign | 交易訊息內文排序雜湊後加Nonce值加HashID再做Sha256運算轉大寫產生Sign字串。 |
6 | Message | 可還原的原始交易訊息內文 +HashID(32位元值 )+IV(16位元值三要素進行AES CBC 加密產生。 |
建置需產出以下項目:
項目|說明 如何取得
項目 | 說明 |
---|---|
APIService | API 服務的名稱。 |
Hash | 產出運算值 (Hash ID) 以計算出安全簽章及訊息加密用。 |
Nonce | 由商戶固定 IP 發動,使用 API 向 funBiz 取得60 秒內有效的時間戳記 。 |
HashID |
規格書說明:
Hash ID 是透過位元運算(XOR)將四組 Hash 計算產出的,將 A1/A2 以 XOR 運算
所得的字串,再與 B1/B2 以 XOR 運算出來的字串,二個相加後將英文轉換為大寫,為
長度為 32 的字串。
程式如下:
A1 = "4D9709D699CA40EE"
A2 = "5A4FEF83140C4E9E"
B1 = "BC74301945134CB4"
B2 = "961F67F8FCA44AB9"
# XOR
OR1 = int(A1,base=16) ^ int(A2,base=16)
OR2 = int(B1,base=16) ^ int(B2,base=16)
hashID = ( format(OR1, 'X') +format(OR2, 'X') )
print("hashID => ",hashID)
結果
NjM3Njc0OTAxMDI1NzQuOTo3NzI1MDBlMWEyMzc3YTk2YWIxNjI0MGE3ZTJjN2VmMDIxYTkxZjlkZDhhMDE1NmVhZDY4MDcyYzUyODQ0ODA1
其中值得注意的是若下hex(OR1),產出的字串頭尾會有0x 70,而format(OR1, 'X') 則不需要處理
hex(OR1) 頭尾多出來的 0x & 70。
商戶透過POST 永豐提供的Nonce API,永豐會驗証該Nonce值的時效性(60秒及取得來源(IP),以確保每次要求來源是一致。
使用POSTMAN軟體測試
查詢方式參考以下圖片,如之前所提,在POSTMAN測試API,只要填入相對應的參數及設定,一鍵搞定測試。
python串接測試
pip install requests
Shop_No = {'ShopNo':"BA0026_001"}
def getNonce(Shop_No):
#print(Shop_No["ShopNo"])
URL ="https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Nonce"
res = requests.post(url = URL, json = Shop_No )
print('status_code => ',res.status_code)
# print('status_code',res.json())
Nonce=res.json()["Nonce"]
res.close()
return Nonce
print(getNonce(Shop_No))
status_code => 200 NjM3Njc0OTAxMDI1NzQuOTo3NzI1MDBlMWEyMzc3YTk2YWIxNjI0MGE3ZTJjN2VmMDIxYTkxZjlkZDhhMDE1NmVhZDY4MDcyYzUyODQ0ODA1
明天接著做Sign後半段的產製囉
請問我照著程式做
hash ID是17D8E6558DC60E702A6B57E1B9B7060D
怎麼短這麼多?